热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

门锁|开锁_物联网应用开发实践案例智能家居

篇首语:本文由编程笔记#小编为大家整理,主要介绍了物联网应用开发实践案例-智能家居相关的知识,希望对你有一定的参考价值。1.前言近年来&#x

篇首语:本文由编程笔记#小编为大家整理,主要介绍了物联网应用开发实践案例-智能家居相关的知识,希望对你有一定的参考价值。



1. 前言

近年来,在智能化、自动化高新技术的驱动下,智能家居工作进入了飞速展开时期。根据国家相关部委推动智慧城市建设布置,以及各地方政府的安排,我国发动智慧城市建设和在建智慧城市的城市数量逾越500个。跟着各地智慧城市建设提速,相关商场规划将有望扩容至千亿,甚至万亿等级。

智能家居是以住宅为平台,利用综合布线技术、网络通信技术、 安全防范技术、自动控制技术、音视频技术将家居生活有关的设施集成,构建高效的住宅设施与家庭日程事务的管理系统,提升家居安全性、便利性、舒适性、艺术性,并实现环保节能的居住环境。

智能家居可以说是一个自动化的物联网系统,你可以用这个系统享受更高效、更有趣的服务(懒人的福利),比如你可以让你通过你的手机或智能音响控制你空调的温度,控制你的扫地机器人扫地,控制你家的窗帘,或者当你离开家的时候家里的台灯,吊顶灯,床头灯都会自动关闭,智能音响会自动说对你说一路顺风,提高自己的生活体验。

智能家居是一个大框架,里面包含了家庭里所有的电器设备智能化,智能门窗、智能门锁、智能电视、智能影像、智能插座、智能空调、智能电饭煲、智能热水器等等。

这篇文章采用智能家居里的典范–智能门锁,来介绍如何让锁变得智能

实现的核心: 将家里的门锁通过WIFI,通过MQTT协议连接上华为云IOT物联网平台,再开发一个配套的手机APP,完成远程开锁关锁的功能。华为云IOT服务器的响应速度非常快,在手机端点击开锁、关锁后,实体设备可以快速响应。

使用华为云物联网云平台完成智能门锁这个需求时,需要了解三个部分的知识点:

(1)如何通过华为云IOT物联网平台创建产品,创建设备。?

(2)如何让设备登录到华为云IOT平台(获取MQTT协议三元组信息) ?

(3)开发手机APP,开发电脑桌面软件、微信小程序时,如何与华为云IOT云平台进行对接?

接下来,下面就陆续介绍整个产品的开发过程,解决这3个疑问,文章里图片、文字描述、代码都会贴出来,只要认真看一遍,就可以对现在的智能家居、物联网、云平台这些概念有个了解了。


2. 设备硬件介绍

当前产品是做一个智能家居里的系列产品–智能门锁。为了模拟真实设备硬件,采用步进电机模拟门锁,STM32+ESP8266作为主控芯片和联网设备。

整体思路:

在华为云IOT物联网平台构建智能锁项目,配置好云端,设备端通过ESP8266连接华为物联网平台,实现数据上报,交互,实现远程开锁、关锁、获取锁的状态等功能,不用担心忘记出门关锁,也不用担心忘记带钥匙无法开门的情况。

ESP8266是物联网解决方案里比较热门的WIFI设备,支持串口+AT指令控制,任意支持串口的单片机都可以使用ESP8266快速实现联网。


步进电机采用常规28BYJ-48来模拟当做门锁的电机,驱动板采用ULN2003。



3. 创建华为云IOT云端设备

登录官网: https://www.huaweicloud.com/

直接搜索物联网,打开页面。

选择设备接入:

选择免费试用:

在产品页面,点击右上角创建产品:

填上产品信息:

得到产品ID,保存好ID,点击查看详情:

产品ID为:61b9ba3a2b2aa20288c1e7f1.

点击设备页面,注册设备:

填充信息进行注册:

保存设备密匙和设备ID,点击保存关闭会自动下载文件保存,后面生成密码和登录账号需要使用

关闭后就看到创建好的设备了:

点击产品页面,选择刚才创建的产品:

选择自定义模型—创建数据模型服务:

选择新增属性,创建设备的属性


4. 创建MQTT登录账号和密匙

设备创建完成接来下生成MQTT登录账号、密匙,方便设备登录云端平台。

官网工具地址: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/

打开刚才创建设备时,下载的密匙文件,把内容复制出来对应的填进去,生成即可。


5. 拼接主题订阅与发布的格式

官方文档介绍: https://support.huaweicloud.com/devg-iothub/iot_01_2127.html

在产品页面可以,看到主题的全部格式:

总结的格式如下:

格式: $oc/devices/device_id/sys/messages/down
//订阅主题: 平台下发消息给设备
$oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510/sys/messages/down
格式: $oc/devices/device_id/sys/properties/report
//设备上报数据
$oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510/sys/properties/report
上属性的数据格式:
//上报的属性消息 (一次可以上报多个属性,在json里增加就行了)
"services": ["service_id": "lock","properties":"门锁":1]

上面属性里的服务ID和属性里的名称,在设备页面,影子设备页面查看。


6. MQTT客户端模拟设备登录云端

下面使用MQTT客户端模拟设备登录服务器测试,看设备创建的是否OK。

服务器的IP地址是: 121.36.42.100

端口号是: 1883

打开MQTT客户端软件,按照提示,输入相关参数后,点击连接,然后再点击订阅主题,发布主题即可:

查看云端服务器的情况: 可以看到设备已经在线了,并且收到上传的数据。

修改一下锁的状态,上报属性再查看:

发现云端的状态也已经改变,现在设备上报已经OK。

接下来测试命令下发,实现远程开锁关锁的功能:

打开产品页面,新增加命令:

命令添加成功:

在设备页面,选择同步命令下发:

点击确定后,查看MQTT客户端,发现已经收到数据了:

$oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497/sys/commands/request_id=88e2626f-290d-405e-962d-51554445a8fd"paras":"lock":1,"service_id":"lock","command_name":"lock"

设备端解析收到的数据,就可以完成多步进电机的控制,完成开锁关锁。


7. 开发硬件设备端

在前面章节里完成产品的云端创建、设备创建、设备模拟登录,开锁关锁测试。本小节,就使用真实设备完成上云,登录华为云IOT平台,实现数据通信。

设备端使用的STM32作为主控芯片,IDE采用keil5,下面贴出了工程核心代码。

工程是keil5工程。
STM32连接华为云IOT的工程代码Get: https://download.csdn.net/download/xiaolong1126626497/81993720

main函数代码如下:

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include
#include "timer.h"
#include "bluetooth.h"
#include "esp8266.h"
#include "mqtt.h"
//华为物联网服务器的设备信息
#define MQTT_ClientID "61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510"
#define MQTT_UserName "61b9ba3a2b2aa20288c1e7f1_QQ1126626497"
#define MQTT_PassWord "385ce91dfe7da5b7431868d5d87e7998163c493344040935d5a00024d6324242"
//订阅与发布的主题
#define SET_TOPIC "$oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510/sys/messages/down" //订阅
#define POST_TOPIC "$oc/devices/61b9ba3a2b2aa20288c1e7f1_QQ1126626497_0_0_2021121510/sys/properties/report" //发布
char mqtt_message[200];//上报数据缓存区
int main()

u32 time_cnt=0;
u32 i;
u8 key;
LED_Init();
BEEP_Init();
KEY_Init();
USART1_Init(115200);
TIMER1_Init(72,20000); //超时时间20ms
USART2_Init(9600);//串口-蓝牙
TIMER2_Init(72,20000); //超时时间20ms
USART3_Init(115200);//串口-WIFI
TIMER3_Init(72,20000); //超时时间20ms
USART1_Printf("正在初始化WIFI请稍等.\\n");
if(ESP8266_Init())

USART1_Printf("ESP8266硬件检测错误.\\n");

else

//非加密端口
USART1_Printf("WIFI:%d\\n",ESP8266_STA_TCP_Client_Mode("CMCC-Cqvn","99pu58cb","121.36.42.100",1883,1));



//2. MQTT协议初始化
MQTT_Init();
//3. 连接华为服务器
while(MQTT_Connect(MQTT_ClientID,MQTT_UserName,MQTT_PassWord))

USART1_Printf("服务器连接失败,正在重试...\\n");
delay_ms(500);

USART1_Printf("服务器连接成功.\\n");

//3. 订阅主题
if(MQTT_SubscribeTopic(SET_TOPIC,0,1))

USART1_Printf("主题订阅失败.\\n");

else

USART1_Printf("主题订阅成功.\\n");


while(1)

key=KEY_Scan(0);
if(key==2)

time_cnt=0;
sprintf(mqtt_message,"\\"services\\": [\\"service_id\\": \\"lock\\",\\"properties\\":\\"门锁\\":1]");
MQTT_PublishData(POST_TOPIC,mqtt_message,0);
USART1_Printf("发送状态1\\r\\n");

else if(key==3)

time_cnt=0;
sprintf(mqtt_message,"\\"services\\": [\\"service_id\\": \\"lock\\",\\"properties\\":\\"门锁\\":0]");
MQTT_PublishData(POST_TOPIC,mqtt_message,0);
USART1_Printf("发送状态0\\r\\n");

if(USART3_RX_FLAG)

USART3_RX_BUFFER[USART3_RX_CNT]='\\0';
for(i&#61;0;i<USART3_RX_CNT;i&#43;&#43;)

USART1_Printf("%c",USART3_RX_BUFFER[i]);

USART3_RX_CNT&#61;0;
USART3_RX_FLAG&#61;0;

//定时发送心跳包,保持连接
delay_ms(10);
time_cnt&#43;&#43;;
if(time_cnt&#61;&#61;500)

MQTT_SentHeart();//发送心跳包
time_cnt&#61;0;




8. 开发手机APP


8.1 功能介绍

为了更方便的完成智能门锁开锁、关锁的操作&#xff0c;与设备完成交互&#xff0c;还需要开发一个配套的手机APP&#xff0c;官方提供了应用侧开发的API接口、SDK接口&#xff0c;为了方便通用一点&#xff0c;这里采用了API接口完成数据交互&#xff0c;上位机软件采用QT开发。QT支持跨平台开发&#xff0c;所有就可以顺便一起开发出androidios、windows、Linux等平台的终端软件。还可以通过wasm技术&#xff0c;开发web网页程序&#xff0c;非常强大的框架。

下面就介绍上位机开发的流程&#xff0c;如何交互等等。

帮助文档地址: https://support.huaweicloud.com/usermanual-iothub/iot_01_0045.html

在文档页面可以看到&#xff0c;提供的接口有&#xff0c;创建产品、创建设备、查询设备属性&#xff0c;查询设备消息等等。

在设计手机APP时&#xff0c;可以直接通过提供的API接口&#xff0c;创建产品&#xff0c;设备&#xff0c;这样设备端就可以直接注册登录。


4.2 查询设备属性接口

设备属性就是设备上传的传感器状态数据信息&#xff0c;应用侧提供了API接口&#xff0c;可以主动向设备端下发请求指令&#xff1b;设备端收到指令之后需要按照约定的数据格式上报数据&#xff1b;所以&#xff0c;要实现应用层与设备端的数据交互&#xff0c;需要应用层与设备端配合才能完成。

下面分别介绍应用测和设备测的实现流程。

&#xff08;1&#xff09;应用层下发的指令

帮助文档地址: https://support.huaweicloud.com/api-iothub/iot_06_v5_0034.html

接口的在线调试地址: https://apiexplorer.developer.huaweicloud.com/apiexplorer/debug?product&#61;IoTDA&api&#61;ListProperties

如果请求参数和返回值不清楚&#xff0c;写代码前&#xff0c;先使用在线调试接口体验一下&#xff0c;验证数据交互是否OK。

请求参数里比较总要的两个必填参数&#xff0c;是设备ID和服务ID&#xff0c;这两个参数在第3章节就介绍过如何获取了&#xff0c;在产品页面创建自定义属性时可以看到服务ID。

请求接口总结:

请求方法 GET
URI地址 /v5/iot/project_id/devices/device_id/properties
传输协议 HTTPS
拼接好的地址:
https://iotda.cn-north-4.myhuaweicloud.com/v5/iot/0e5957be8a00f53c2fa7c0045e4d8fbf/devices/61df9a6bc7fb24029b0c160d_1126626497/properties?service_id&#61;1126626497
其中的project_id和device_id需要根据自己的设备信息修改。
请求头:

"User-Agent": "API Explorer",
"X-Auth-Token": "******", 这个是鉴权用的token
"Content-Type": "application/json"

响应体(设备上传的数据)

"response":
"services": [

"service_id": "lock",
"properties":
"lock": 1

,

]


请求头里需要填X-Subject-Token参数&#xff0c;这个参数只要是访问任何华为云都需要填&#xff0c;获取具体的流程可以看这里。https://bbs.huaweicloud.com/blogs/317759 翻到第3小节。

&#xff08;2&#xff09;设备上传数据

应用层向设备端请求查询设备属性时&#xff0c;设备端会收到如下的消息:

$oc/devices/61df9a6bc7fb24029b0c160d_1126626497/sys/properties/get/request_id&#61;336bcb57-0e0a-44d0-90f7-31386cb54a3c"service_id":"1126626497"

这个消息里有一个主要参数request_id请求ID&#xff0c;设备端需要解析出这个参数&#xff0c;给应用层响应数据时&#xff0c;需要带上这个ID。

这个请求属性详细帮助文档看这里: https://support.huaweicloud.com/api-iothub/iot_06_v5_3011.html

设备响应的数据格式:

主题格式: $oc/devices/device_id/sys/properties/get/response/request_id&#61;request_id
示 例:
$oc/devices/61df9a6bc7fb24029b0c160d_1126626497/sys/properties/get/response/request_id&#61;336bcb57-0e0a-44d0-90f7-31386cb54a3c
响应的数据格式:
"services": ["service_id": "healthy","properties":"HeartRate":127]

响应的数据格式可以看这里的介绍: https://support.huaweicloud.com/api-iothub/iot_06_v5_3010.html


4.3 在线API调试结合设备模拟

下面使用MQTT客户端与在线API接口联合模拟一下接口效果&#xff1a;

&#xff08;1&#xff09;先打开调试页面: https://apiexplorer.developer.huaweicloud.com/apiexplorer/debug?product&#61;IoTDA&api&#61;ListProperties

然后填好设备DI和服务ID&#xff1a;

(2)、打开MQTT客户端&#xff0c;登录华为云物联网平台&#xff08;也就是模拟设备上线&#xff09;&#xff1a;

(3)、打开在线API调试页面&#xff0c;点击调试&#xff1a; 点击后可以看到页面上已经在等待客户端的响应了。

(4)、MQTT客户端响应详细

按照前面说的响应格式&#xff0c;拼接好接口&#xff0c;数据。然后发布主题。

(5)、应用层收到客户端响应,调试成功

调试成功后&#xff0c;响应体里收到的就是设备端上传的设备属性数据。


4.4 应用层核心代码

/*
功能: 获取token
*/

void Widget::GetToken()

//表示获取token
function_select&#61;3;
QString requestUrl;
QNetworkRequest request;
//设置请求地址
QUrl url;
//获取token请求地址
requestUrl &#61; QString("https://iam.%1.myhuaweicloud.com/v3/auth/tokens")
.arg(SERVER_ID);
//自己创建的TCP服务器,测试用
//requestUrl&#61;"http://10.0.0.6:8080";
//设置数据提交格式
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json;charset&#61;UTF-8"));
//构造请求
url.setUrl(requestUrl);
request.setUrl(url);
QString text &#61;QString("\\"auth\\":\\"identity\\":\\"methods\\":[\\"password\\"],\\"password\\":"
"\\"user\\":\\"domain\\": "
"\\"name\\":\\"%1\\",\\"name\\": \\"%2\\",\\"password\\": \\"%3\\","
"\\"scope\\":\\"project\\":\\"name\\":\\"%4\\"")
.arg(MAIN_USER)
.arg(IAM_USER)
.arg(IAM_PASSWORD)
.arg(SERVER_ID);
//发送请求
manager->post(request, text.toUtf8());

//查询设备属性
void Widget::Get_device_properties()

//表示获取token
function_select&#61;0;
QString requestUrl;
QNetworkRequest request;
//设置请求地址
QUrl url;
//获取token请求地址
requestUrl &#61; QString("https://iotda.%1.myhuaweicloud.com/v5/iot/%2/devices/%3/properties?service_id&#61;%4")
.arg(SERVER_ID)
.arg(PROJECT_ID)
.arg(device_id)
.arg(service_id);
//自己创建的TCP服务器,测试用
//requestUrl&#61;"http://10.0.0.6:8080";
//设置数据提交格式
request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
//设置token
request.setRawHeader("X-Auth-Token",Token);
//构造请求
url.setUrl(requestUrl);
request.setUrl(url);
//发送请求
manager->get(request);


4.5 上位机运行效果

到此&#xff0c;智能门锁完成。


推荐阅读
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • 本文介绍了一些好用的搜索引擎的替代品,包括网盘搜索工具、百度网盘搜索引擎等。同时还介绍了一些笑话大全、GIF笑话图片、动态图等资源的搜索引擎。此外,还推荐了一些迅雷快传搜索和360云盘资源搜索的网盘搜索引擎。 ... [详细]
  • 【MicroServices】【Arduino】装修甲醛检测,ArduinoDart甲醛、PM2.5、温湿度、光照传感器等,数据记录于SD卡,Python数据显示,UI5前台,微服务后台……
    这篇文章介绍了一个基于Arduino的装修甲醛检测项目,使用了ArduinoDart甲醛、PM2.5、温湿度、光照传感器等硬件,并将数据记录于SD卡,使用Python进行数据显示,使用UI5进行前台设计,使用微服务进行后台开发。该项目还在不断更新中,有兴趣的可以关注作者的博客和GitHub。 ... [详细]
  • 数字账号安全与数据资产问题的研究及解决方案
    本文研究了数字账号安全与数据资产问题,并提出了解决方案。近期,大量QQ账号被盗事件引起了广泛关注。欺诈者对数字账号的价值认识超过了账号主人,因此他们不断攻击和盗用账号。然而,平台和账号主人对账号安全问题的态度不正确,只有用户自身意识到问题的严重性并采取行动,才能推动平台优先解决这些问题。本文旨在提醒用户关注账号安全,并呼吁平台承担起更多的责任。令牌云团队对此进行了长期深入的研究,并提出了相应的解决方案。 ... [详细]
  • 解决github访问慢的问题的方法集锦
    本文总结了国内用户在访问github网站时可能遇到的加载慢的问题,并提供了解决方法,其中包括修改hosts文件来加速访问。 ... [详细]
  • 2018深入java目标计划及学习内容
    本文介绍了作者在2018年的深入java目标计划,包括学习计划和工作中要用到的内容。作者计划学习的内容包括kafka、zookeeper、hbase、hdoop、spark、elasticsearch、solr、spring cloud、mysql、mybatis等。其中,作者对jvm的学习有一定了解,并计划通读《jvm》一书。此外,作者还提到了《HotSpot实战》和《高性能MySQL》等书籍。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
author-avatar
jrvzx342841
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有